package com.qf.ayc.utils;

import cn.hutool.core.util.XmlUtil;
import cn.hutool.crypto.digest.DigestUtil;
import cn.hutool.http.HttpRequest;
import com.qf.ayc.vo.WxpayVo;

import java.util.*;

public class WxPayUtils {

    public static final String UNIFIORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";

    public static final String QUERYORDER = "https://api.mch.weixin.qq.com/pay/orderquery";

    public static final String APPID = "wx632c8f211f8122c6";
    public static final String MCH_ID = "1497984412";
    public static final String APPKEY = "sbNCm1JnevqI36LrEaxFwcaT0hkGxFnC";

    /**
     * 支付状态
     * NOTPAY--未支付
     * SUCCESS--支付成功
     * @param orderId
     * @return
     */
    //输入订单编号，查看订单支付的状态
    public static String queryOrderStatus(String orderId) {
        // 处理微信支付的参数
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("appid",APPID);
        hashMap.put("mch_id",MCH_ID);
        String nonce = UUID.randomUUID().toString().replaceAll("-", "");
        hashMap.put("nonce_str",nonce); // 微信要求的随机字符串，长度32个字符以内
        hashMap.put("out_trade_no",orderId); // 订单编号
        // 计算正确的签名
        String sign = getWxSignature(hashMap);
        hashMap.put("sign",sign);  // 签名

        String xml = XmlUtil.mapToXmlStr(hashMap);
        System.out.println(xml);

        String data = HttpRequest.post(QUERYORDER)
                .body(xml) // post请求体中的数据
                .execute()
                .body();

        System.out.println(data);
        // 把xml字符串转换成 map
        Map<String, Object> resultMap = XmlUtil.xmlToMap(data);
        String result = (String) resultMap.get("trade_state");
        return  result;
    }

//传入参数，拿到可以支付的url，可以去草料变成二维码
    public static String getPayUrl(WxpayVo wxpayVo) {
        // 处理微信支付的参数
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("appid",APPID);
        hashMap.put("mch_id",MCH_ID);
        String nonce = UUID.randomUUID().toString().replaceAll("-", "");
        hashMap.put("nonce_str",nonce); // 微信要求的随机字符串，长度32个字符以内
        hashMap.put("body",wxpayVo.getOrderInfo());  // 订单描述
//        String orderID = UUID.randomUUID().toString().replaceAll("-", "");
        hashMap.put("out_trade_no",wxpayVo.getOrderId()); // 订单编号，不能是汉字，否则不能生成
        hashMap.put("total_fee",1); // 订单金额,wxpayVo.getTotalFee()
        hashMap.put("notify_url","http://47.118.45.73:8080/pay/callback");  // 商户自己的回调地址
        hashMap.put("trade_type","NATIVE");  // 支付的类型， PC端页面支付（NATIVE）
        // 计算正确的签名
        String sign = getWxSignature(hashMap);
        hashMap.put("sign",sign);  // 签名

        String xml = XmlUtil.mapToXmlStr(hashMap);
        System.out.println(xml);

        String data = HttpRequest.post(UNIFIORDER)
                .body(xml) // post请求体中的数据
                .execute()
                .body();

        System.out.println(data);
        // 把xml字符串转换成 map
        Map<String, Object> resultMap = XmlUtil.xmlToMap(data);
        String url = (String) resultMap.get("code_url");
        return url;

    }

    private static String getWxSignature(HashMap<String, Object> hashMap) {

        // 计算签名的第一步
        // 把map中的所有参数，按照 key 进行从小到大排序 ，得到如下的字符串
        // stringA="appid=wxd930ea5d5a258f4f&body=test&device_info=1000&mch_id=10000100&nonce_str=ibuaiVcKdpRxkhJA";

        Set<String> keySet = hashMap.keySet();
        String[] keyArr = new String[keySet.size()];
        // 得到包含所有key的数组
        keyArr = keySet.toArray(keyArr);
        // 对数组 中的数据进行排序
        Arrays.sort(keyArr);
        StringBuffer stringBuffer = new StringBuffer();
        for (String key : keyArr) {
             stringBuffer.append(key);
             stringBuffer.append("=");
             stringBuffer.append(hashMap.get(key));
             stringBuffer.append("&");
        }
        String stringA = stringBuffer.toString();
        System.out.println(stringA);

        // 计算的第二步，拼接只有服务器端（和微信）知道的密钥
        String tempString = stringA + "key=" + APPKEY;
        // 计算MD5值
        String sign = DigestUtil.md5Hex(tempString).toUpperCase();

        return sign;
    }

}
